package test.sunyu.kit.mina;

import org.junit.Test;
import org.slf4j.Logger;
import sunyu.kit.common.*;
import sunyu.kit.mina.SocketClient;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @author 孙宇
 */
public class 国标过检测试 {

    private static final Logger logger = LogKit.getLogger();

    String WEB_SESSION = "06201A3CC575A621E0C80C1DA3AC01BC";

    String loginName = "hzplgqc00000";
    String loginPassword = "plg-01@0000000000000";
    String vin = "LB91CKAA7F1WNZ027";
    String did = "homer123456789013";
    String ICCID = "89860010648203989290";

    String 国标网关IP = "218.205.176.44";
    int 国标网关端口 = 19007;
    String 公司转发网关IP = "192.168.11.109";
    int 公司转发网关端口 = 19006;

    @Test
    public void 报文解析() {
        String hexDataString = "23230602000000000000000000000000000000000001000611010A0B371035";
        ProtocolKit.报文解析(hexDataString, WEB_SESSION);
    }

    @Test
    public void 报文校验() {
        String hexDataString = "232303FE686F6D65723132333435363738393031340100391101060F0701010203010000000000640000277400022E00000000020101013050D24E80390D772770050006EF0D280261F670040200000000F8";
        ProtocolKit.报文校验(hexDataString, WEB_SESSION);
    }

    @Test
    public void 平台登入登出5次() throws InterruptedException, IOException {
        File f = new File("D:/平台登入登出5次.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(国标网关IP, 国标网关端口, f);//直接往国标网关发送

        int loginNum = 1;//登入登出流水号

        for (int i = 1; i <= 5; i++) {
            平台登入(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            平台登出(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum++;
        }
        TimeUnit.SECONDS.sleep(1);
        client.getConnector().dispose(true);
    }


    @Test
    public void 车辆登入登出5次() throws IOException, InterruptedException {
        File f = new File("D:/车辆登入登出5次.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        int loginNum = 1;

        for (int i = 1; i <= 5; i++) {
            车辆登入(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            车辆登出(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum++;
        }
        TimeUnit.SECONDS.sleep(1);
        client.getConnector().dispose(true);
    }


    @Test
    public void 行驶数据发送15分钟以上() throws IOException, InterruptedException {
        File f = new File("D:/行驶数据发送15分钟以上.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        byte[] bytes;
        int loginNum = 1;

        车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(10);

        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.未充电状态;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        Date endTime = TimeKit.addMinute(new Date(), 16);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            bytes = ProtocolKit.信息上报(命令标识.实时信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [行驶数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() >= endTime.getTime()) {
                break;
            }
        }

        车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        client.getConnector().dispose(true);
    }

    @Test
    public void 充电数据发送15分钟以上() throws IOException, InterruptedException {
        File f = new File("D:/充电数据发送15分钟以上.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        byte[] bytes;
        int loginNum = 1;

        车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(10);

        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.停车充电;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        Date endTime = TimeKit.addMinute(new Date(), 16);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            bytes = ProtocolKit.信息上报(命令标识.实时信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [充电数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() >= endTime.getTime()) {
                break;
            }
        }

        车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        client.getConnector().dispose(true);
    }

    /**
     * 先发生报警，发送一条报警数据，报警等级为3，假设发生报警时间为10点30分30秒
     * 然后发送报警数据前的30条，1秒1条(补发类型)，依次发送10点30分29秒、28秒、27秒....
     * 然后再发送报警数据后的30条，1秒1条(信息上报类型)，依次发送10点30分31秒、32秒、33秒...
     * 然后再每隔10秒，发送信息上报数据
     */
    @Test
    public void 发送报警数据() throws IOException, InterruptedException {
        File f = new File("D:/报警数据.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        int loginNum = 1;

        车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(30);

        Date alarmTime = 报警(f, client);
        补发报警前的30条记录(f, client, alarmTime);
        报警后的30条实时数据(f, client, alarmTime);
        再发一会实时数据10秒一条(f, client);

        车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        client.getConnector().dispose(true);
    }

    @Test
    public void 发送车辆补发数据() throws IOException, InterruptedException {
        File f = new File("D:/车辆补发数据.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        int loginNum = 1;

        车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        车辆补发10分钟(f, client);

        车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        TimeUnit.SECONDS.sleep(1);
        client.getConnector().dispose(true);
    }


    @Test
    public void 发送平台补发数据() throws InterruptedException, IOException {
        File f = new File("D:/平台补发数据.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(国标网关IP, 国标网关端口, f);//直接往国标网关发送

        int loginNum = 1;//登入登出流水号

        平台登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        平台补发10分钟(f, client);

        平台登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        TimeUnit.SECONDS.sleep(1);
        client.getConnector().dispose(true);
    }


    private void 再发一会实时数据10秒一条(File f, SocketClient client) throws InterruptedException {
        byte[] bytes;
        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.未充电状态;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        for (int i = 0; i < 10; i++) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            bytes = ProtocolKit.信息上报(命令标识.实时信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [实时数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
        }
    }

    private void 报警后的30条实时数据(File f, SocketClient client, Date alarmTime) throws InterruptedException {
        byte[] bytes;
        for (int i = 0; i < 30; i++) {//发30条实时
            整车数据 zcsj = new 整车数据();
            zcsj.车辆状态 = 车辆状态.熄火;
            zcsj.充电状态 = 充电状态.未充电状态;
            zcsj.运行模式 = 运行模式.纯电;
            zcsj.车速 = ByteKit.int2bytes(0, 2);
            zcsj.累计里程 = ByteKit.int2bytes(100, 4);
            zcsj.总电压 = ByteKit.int2bytes(0, 2);
            zcsj.总电流 = ByteKit.int2bytes(10100, 2);
            zcsj.SOC = ByteKit.int2bytes(0, 1);
            zcsj.DC状态 = DC状态.断开;
            zcsj.档位 = 档位.有驱动力无制动力D挡;
            zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

            驱动电机数据 qddjsj = new 驱动电机数据();
            驱动电机 qddj = new 驱动电机();
            qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
            qddj.驱动电机状态 = 驱动电机状态.耗电;
            qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
            qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
            qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
            qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
            qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
            qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
            qddjsj.驱动电机总成信息列表.add(qddj);
            qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

            车辆位置数据 clwzsj = new 车辆位置数据();
            clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
            clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
            clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

            发动机数据 fdjsj = new 发动机数据();
            fdjsj.发动机状态 = 发动机状态.关闭状态;
            fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
            fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

            Date time = TimeKit.addSecond(alarmTime, (i + 1));//依次递增的时间
            String timeString = TimeKit.format("yyyyMMddHHmmss", time);
            bytes = ProtocolKit.信息上报(命令标识.实时信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [实时数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(1);
        }
    }

    private void 补发报警前的30条记录(File f, SocketClient client, Date alarmTime) throws InterruptedException {
        byte[] bytes;
        for (int i = 0; i < 30; i++) {//发30条补发
            整车数据 zcsj = new 整车数据();
            zcsj.车辆状态 = 车辆状态.熄火;
            zcsj.充电状态 = 充电状态.未充电状态;
            zcsj.运行模式 = 运行模式.纯电;
            zcsj.车速 = ByteKit.int2bytes(0, 2);
            zcsj.累计里程 = ByteKit.int2bytes(100, 4);
            zcsj.总电压 = ByteKit.int2bytes(0, 2);
            zcsj.总电流 = ByteKit.int2bytes(10100, 2);
            zcsj.SOC = ByteKit.int2bytes(0, 1);
            zcsj.DC状态 = DC状态.断开;
            zcsj.档位 = 档位.有驱动力无制动力D挡;
            zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

            驱动电机数据 qddjsj = new 驱动电机数据();
            驱动电机 qddj = new 驱动电机();
            qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
            qddj.驱动电机状态 = 驱动电机状态.耗电;
            qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
            qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
            qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
            qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
            qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
            qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
            qddjsj.驱动电机总成信息列表.add(qddj);
            qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

            车辆位置数据 clwzsj = new 车辆位置数据();
            clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
            clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
            clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

            发动机数据 fdjsj = new 发动机数据();
            fdjsj.发动机状态 = 发动机状态.关闭状态;
            fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
            fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

            Date time = TimeKit.addSecond(alarmTime, -(i + 1));//依次递减的时间
            String timeString = TimeKit.format("yyyyMMddHHmmss", time);
            bytes = ProtocolKit.信息上报(命令标识.补发信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [补发数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(1);
        }
    }

    private Date 报警(File f, SocketClient client) throws InterruptedException {
        byte[] bytes;
        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.停车充电;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(0, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        报警数据 bjsj = new 报警数据();
        bjsj.最高报警等级 = 最高报警等级.三级故障;
        bjsj.通用报警标识 = new 通用报警标识(1, 0, 0, 0
                , 0, 0, 0, 0
                , 0, 0, 0, 0
                , 0, 0, 0, 0
                , 0, 0, 0).data;
        bjsj.可充电储能装置故障总数N1 = ByteKit.int2bytes(0, 1);
        bjsj.可充电储能装置故障代码列表 = ByteKit.int2bytes(0, 4 * bjsj.可充电储能装置故障总数N1.length);
        bjsj.驱动电机故障总数N2 = ByteKit.int2bytes(0, 1);
        bjsj.驱动电机故障代码列表 = ByteKit.int2bytes(0, 4 * bjsj.驱动电机故障总数N2.length);
        bjsj.发动机故障总数N3 = ByteKit.int2bytes(0, 1);
        bjsj.发动机故障列表 = ByteKit.int2bytes(0, 4 * bjsj.发动机故障总数N3.length);
        bjsj.其他故障总数N4 = ByteKit.int2bytes(0, 1);
        bjsj.其他故障列表 = ByteKit.int2bytes(0, 4 * bjsj.其他故障总数N4.length);

        Date alarmTime = new Date();//记录报警的时间

        String timeString = TimeKit.format("yyyyMMddHHmmss", alarmTime);
        bytes = ProtocolKit.信息上报(命令标识.实时信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, bjsj, fdjsj);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [报警数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
        client.sendBytes(bytes);
        TimeUnit.SECONDS.sleep(1);

        return alarmTime;
    }


    private void 平台登出(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.平台登出(TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台登出] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
    }

    private void 平台登入(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.平台登入(TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum, loginName, loginPassword);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台登入] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
    }

    private void 车辆登出(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.车辆登出(did, TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆登出] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
    }

    private void 车辆登入(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.车辆登入(did, TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum, ICCID, 0, 0);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆登入] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
    }

    private void 平台补发10分钟(File f, SocketClient client) throws InterruptedException {
        byte[] bytes;
        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.未充电状态;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        Date endTime = TimeKit.addMinute(new Date(), 10);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", TimeKit.addMinute(new Date(), -10));//10分钟前
            bytes = ProtocolKit.信息上报(命令标识.补发信息上报, vin, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台补发数据] " + StringKit.bytes2hexString(bytes));
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() > endTime.getTime()) {
                break;
            }
        }
    }

    private void 车辆补发10分钟(File f, SocketClient client) throws InterruptedException {
        byte[] bytes;
        整车数据 zcsj = new 整车数据();
        zcsj.车辆状态 = 车辆状态.熄火;
        zcsj.充电状态 = 充电状态.未充电状态;
        zcsj.运行模式 = 运行模式.纯电;
        zcsj.车速 = ByteKit.int2bytes(0, 2);
        zcsj.累计里程 = ByteKit.int2bytes(100, 4);
        zcsj.总电压 = ByteKit.int2bytes(0, 2);
        zcsj.总电流 = ByteKit.int2bytes(10100, 2);
        zcsj.SOC = ByteKit.int2bytes(0, 1);
        zcsj.DC状态 = DC状态.断开;
        zcsj.档位 = 档位.有驱动力无制动力D挡;
        zcsj.绝缘电阻 = ByteKit.int2bytes(0, 2);

        驱动电机数据 qddjsj = new 驱动电机数据();
        驱动电机 qddj = new 驱动电机();
        qddj.驱动电机序号 = ByteKit.int2bytes(1, 1);
        qddj.驱动电机状态 = 驱动电机状态.耗电;
        qddj.驱动电机控制器温度 = ByteKit.int2bytes(48, 1);
        qddj.驱动电机转速 = ByteKit.int2bytes(20690, 2);
        qddj.驱动电机转矩 = ByteKit.int2bytes(20096, 2);
        qddj.驱动电机温度 = ByteKit.int2bytes(57, 1);
        qddj.电机控制器输入电压 = ByteKit.int2bytes(3447, 2);
        qddj.电机控制器直流母线电流 = ByteKit.int2bytes(10096, 2);
        qddjsj.驱动电机总成信息列表.add(qddj);
        qddjsj.驱动电机个数 = ByteKit.int2bytes(qddjsj.驱动电机总成信息列表.size(), 1);

        车辆位置数据 clwzsj = new 车辆位置数据();
        clwzsj.定位状态 = new 定位状态(0, 0, 0).data;
        clwzsj.经度 = ByteKit.int2bytes(116329768, 4);
        clwzsj.纬度 = ByteKit.int2bytes(39974512, 4);

        发动机数据 fdjsj = new 发动机数据();
        fdjsj.发动机状态 = 发动机状态.关闭状态;
        fdjsj.曲轴转速 = ByteKit.int2bytes(0, 2);
        fdjsj.燃料消耗率 = ByteKit.int2bytes(0, 2);

        Date endTime = TimeKit.addMinute(new Date(), 10);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", TimeKit.addMinute(new Date(), -10));
            bytes = ProtocolKit.信息上报(命令标识.补发信息上报, did, timeString, zcsj, qddjsj, clwzsj, null, null, fdjsj);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆补发数据] " + StringKit.bytes2hexString(bytes) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() > endTime.getTime()) {
                break;
            }
        }
    }

}
